home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.9
/
kickpascal-programme
/
leftymouse
/
leftymouse.p
< prev
next >
Wrap
Text File
|
1995-04-19
|
4KB
|
173 lines
Program LeftyMouse;
{ Version 1.0
© 1993 by Björn Schotte
FREEWARE }
Uses ExecIO, Intuition, Graphics;
{$opt b-;
incl "exec/interrupts.h",
"devices/input.h",
"devices/inputevent.h"}
Const
MYPORTNAME = "LeftyMouse.Port";
LM_TASKNAME = "LeftyMouse.Task";
conpos = "CON:100/60/330/63/LeftyMouse";
Type CodeTyp = Array[1..15] of Word;
Var port : p_MsgPort; { Port zur Kommunikation mit dem Device }
ioreq : p_IOStdReq; { Hier reicht Standard-Struktur }
inter : Interrupt; { Interrupt-Struktur zum Handler }
err : integer; { Fehlernummern der Device-Operationen }
ThisTask : p_Task; { Zeiger auf diesen Task }
_paslibbase : Byte; IMPORT; { Pascal-interne Adresse }
InterfaceCode : Codetyp; { Speicher für kurze Assembler-Routine }
Sig,SigBit,Signals : Long;
Procedure installed;
Begin
If FromWB Then
Begin
Reset(output,conpos);
If IOResult>0 Then exit;
End;
Writeln(#27"[33mLeftyMouse V1.0"#27"[0m");
Writeln("1993 by",#27,"[33m Björn Schotte",#27"[0m");
Writeln;
Writeln("has just been installed...");
If FromWB Then
Begin
Delay(2*50);
Close(output);
End;
End;
Procedure removed;
Begin
If FromWB Then
Begin
Reset(output,conpos);
If IOResult>0 Then exit;
End;
Writeln(#27"[33mLeftyMouse V1.0"#27"[0m");
Writeln("1993 by",#27,"[33m Björn Schotte",#27"[0m");
Writeln;
Writeln("has just been removed...");
If FromWB Then
Begin
Delay(2*50);
Close(output);
End;
End;
{$opt b-,s-}
Function Handler (data: Ptr; event: p_InputEvent) : p_InputEvent;
Var e2 : p_InputEvent;
err : Boolean;
Begin
e2 := event;
Forbid;
While e2 <> Nil Do
Begin
If ((e2^.ie_Class and IECLASS_RAWMOUSE)<>0) Then
Begin
Case e2^.ie_Code Of
{ LeftyMouse-Funktion }
IECODE_LBUTTON :
Begin
e2^.ie_Code:=IECODE_RBUTTON;
End;
IECODE_LBUTTON+128 :
Begin
e2^.ie_Code:=IECODE_RBUTTON+128;
End;
IECODE_RBUTTON :
Begin
e2^.ie_Code:=IECODE_LBUTTON;
End;
IECODE_RBUTTON+128 :
Begin
e2^.ie_Code:=IECODE_LBUTTON+128;
End;
Else End;
End;
e2 := e2^.ie_NextEvent { nächstes Element der Liste }
End;
Permit;
Handler := event; { Zeiger auf alte Liste zurückgeben }
End;
{$opt s0}
Begin { Hauptprogramm }
InterfaceCode :=
CodeTyp($48E7, $7F00, { MOVEM.L d1-d7,-(a7) }
$48E7, $00FE, { MOVEM.L a0-a6,-(a7) }
$4BF9, Addr(_paslibbase) shr 16,
Addr(_paslibbase) and $FFFF,{ LEA _paslibbase,a5 }
$4EB9, Addr(Handler) shr 16,
Addr(Handler) and $FFFF, { JSR Handler }
$4CDF, $7F00, { MOVEM.L (a7)+,a0-a6 }
$4CDF, $00FE, { MOVEM.L (a7)+,a1-a7 }
$4E75 { RTS }
);
port := FindPort(MYPORTNAME);
If port<>NIL Then
Begin
ThisTask:=FindTask(LM_TASKNAME);
If ThisTask<>NIL Then
Begin
Signals:=ThisTask^.tc_SigWait;
Signal(ThisTask,Signals);
Halt(0);
End;
End;
port := CreatePort (MYPORTNAME, 0);
ioreq := CreateStdIO (port);
Open_Device ('input.device', 0, ioreq, 0);
{ Alles für die Kommunikation zwischen Handler und Hauptprogramm
vorbereiten: }
ThisTask := FindTask (Nil);
ThisTask^.tc_Node.ln_Name:=LM_TASKNAME;
SigBit := AllocSignal(-1);
If SigBit=-1 Then Error("Kein Signal !");
{ Interrupt-Struktur initialisieren: }
With inter, is_node Do
Begin
is_Code := ^InterfaceCode;
is_Data := Nil;
ln_Name := 'LeftyMouseHandler.[BS]';
ln_Pri := 127
End;
{ Jetzt wird's spannend: }
ioreq^.io_Data := ^inter;
ioreq^.io_Command := IND_ADDHANDLER;
err := DoIO (ioreq);
installed;
Sig:=Wait(1 Shl SigBit);
{ System wieder aufräumen: }
ioreq^.io_Data := ^inter;
ioreq^.io_Command := IND_REMHANDLER;
err := DoIO (ioreq);
Close_Device (ioreq);
DeleteStdIO (ioreq);
DeletePort (port);
removed;
End.